﻿// 110. 防晒.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

/*
https://www.acwing.com/problem/content/112/

有 C 头奶牛进行日光浴，第 i 头奶牛需要 minSPF[i] 到 maxSPF[i] 单位强度之间的阳光。

每头奶牛在日光浴前必须涂防晒霜，防晒霜有 L 种，涂上第 i 种之后，身体接收到的阳光强度就会稳定为 SPF[i]，第 i 种防晒霜有 cover[i] 瓶。

求最多可以满足多少头奶牛进行日光浴。

输入格式
第一行输入整数 C 和 L。

接下来的 C 行，按次序每行输入一头牛的 minSPF 和 maxSPF 值，即第 i 行输入 minSPF[i] 和 maxSPF[i]。

再接下来的 L 行，按次序每行输入一种防晒霜的 SPF 和 cover 值，即第 i 行输入 SPF[i] 和 cover[i]。

每行的数据之间用空格隔开。

输出格式
输出一个整数，代表最多可以满足奶牛日光浴的奶牛数目。

数据范围
1≤C,L≤2500,
1≤minSPF≤maxSPF≤1000,
1≤SPF≤1000
输入样例：
5 3
3 10
6 10
2 3
2 5
1 5
6 2
4 1
1 3
输出样例：
2
*/

//关键在于排序  防晒max 从小到大排序 相同的 选择
const int N = 2510;

vector<pair<int, int>> cows;
vector<pair<int, int>> med;

int C, L;
int main()
{
    cin >> C >> L;
    for (int i = 0; i < C; i++) {
        int a, b; cin >> a >> b;
        if (a > b)swap(a, b);
        cows.push_back({ b,a });
    }

    for (int i = 0; i < L; i++) {
        pair<int, int> tmp; cin >> tmp.first >> tmp.second;
        med.push_back(tmp);
    }

    sort(cows.begin(), cows.end());
    sort(med.begin(), med.end());
    int ans = 0;
    for (int i = 0; i < C; i++) {
        for (int j = 0; j < L; j++) {
            int r = cows[i].first; int l = cows[i].second;
            if (med[j].first >= l && med[j].first <= r && med[j].second > 0) {
                ans++; med[j].second--; break;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

